#ifndef _THREAD_H_
#define _THREAD_H_

#include <mutex>
#include <condition_variable>
#include <functional>     

namespace sylar
{
/**
 * @brief 信号量类，用于线程间同步
 * 基于std::mutex和std::condition_variable实现PV操作
 * 性能优化点：
 * 1. 使用unique_lock而非lock_guard，允许条件变量释放锁
 * 2. notify_one而非notify_all减少不必要的线程唤醒
 */
class Semaphore 
{
private:
    std::mutex mtx;                // 互斥锁，保护count变量
    std::condition_variable cv;    // 条件变量，用于线程等待/唤醒
    int count;                   // 信号量计数器

public:
    /**
     * @brief 构造函数
     * @param count_ 初始信号量值，默认为0
     * @note 使用explicit防止隐式类型转换
     */
    explicit Semaphore(int count_ = 0) : count(count_) {}
    
    /**
     * @brief P操作(等待信号量)
     * @note 使用while而非if避免虚假唤醒
     * @performance 使用unique_lock允许条件变量释放锁
     */
    void wait() 
    {
        std::unique_lock<std::mutex> lock(mtx);
        while (count == 0) { 
            cv.wait(lock); // wait for signals
        }
        count--;
    }

    /**
     * @brief V操作(释放信号量)
     * @performance 使用notify_one而非notify_all减少线程竞争
     */
    void signal() 
    {
        std::unique_lock<std::mutex> lock(mtx);
        count++;
        cv.notify_one();  // signal
    }
};

/**
 * @brief 线程封装类
 * 封装pthread接口，提供更友好的线程管理
 * 功能特点：
 * 1. 支持线程命名
 * 2. 支持线程局部存储
 * 3. 提供join/detach接口
 * 性能优化点：
 * 1. 使用信号量确保线程初始化完成
 * 2. 使用swap减少智能指针引用计数
 */
class Thread 
{
public:
    /**
     * @brief 构造函数
     * @param cb 线程执行函数
     * @param name 线程名称
     * @note 使用信号量确保线程初始化完成
     */
    Thread(std::function<void()> cb, const std::string& name);
    ~Thread();

    /// @brief 获取线程系统ID
    pid_t getId() const { return m_id; }
    /// @brief 获取线程名称
    const std::string& getName() const { return m_name; }

    /// @brief 等待线程结束
    void join();

public:
    /**
     * @brief 获取系统线程ID
     * @note 使用syscall(SYS_gettid)获取真实线程ID
     */
	static pid_t GetThreadId();
    /// @brief 获取当前线程对象指针
    static Thread* GetThis();

    /// @brief 获取当前线程名称
    static const std::string& GetName();
    /**
     * @brief 设置当前线程名称
     * @param name 线程名称
     * @note 名称长度限制为15字符(pthread限制)
     */
    static void SetName(const std::string& name);

private:
	/**
     * @brief 线程入口函数
     * @param arg 线程参数(Thread对象指针)
     * @performance 使用swap减少智能指针引用计数
     */
    static void* run(void* arg);

private:
    pid_t m_id = -1;            // 线程系统ID
    pthread_t m_thread = 0;      // pthread线程句柄

    std::function<void()> m_cb;  // 线程执行函数
    std::string m_name;          // 线程名称
    
    Semaphore m_semaphore;       // 用于线程初始化同步
};

























}



#endif
